@@ -7,10 +7,10 @@ module Agents |
||
| 7 | 7 |
description <<-MD |
| 8 | 8 |
The TwitterPublishAgent publishes tweets from the events it receives. |
| 9 | 9 |
|
| 10 |
- You must set up a Twitter app and provide it's `consumer_key`, `consumer_secret`, `oauth_token` and `oauth_token_secret`, |
|
| 11 |
- (Also shown as "Access token" on the Twitter developer's site.) along with the `username` of the Twitter user to publish as. |
|
| 10 |
+ You [must set up a Twitter app](https://github.com/cantino/huginn/wiki/Getting-a-twitter-oauth-token) and provide it's `consumer_key`, `consumer_secret`, `oauth_token` and `oauth_token_secret`, |
|
| 11 |
+ (also knows as "Access token" on the Twitter developer's site), along with the `username` of the Twitter user to publish as. |
|
| 12 | 12 |
|
| 13 |
- The `oauth_token` and `oauth_token_secret` specified determine which user the tweet will be sent as. |
|
| 13 |
+ The `oauth_token` and `oauth_token_secret` determine which user the tweet will be sent as. |
|
| 14 | 14 |
|
| 15 | 15 |
You must also specify a `message_path` parameter: a [JSONPaths](http://goessner.net/articles/JsonPath/) to the value to tweet. |
| 16 | 16 |
|
@@ -5,9 +5,11 @@ module Agents |
||
| 5 | 5 |
description <<-MD |
| 6 | 6 |
The TwitterStreamAgent follows the Twitter stream in real time, watching for certain keywords, or filters, that you provide. |
| 7 | 7 |
|
| 8 |
- You must provide a `twitter_username` and `twitter_password`, as well as an array of `filters`. Multiple words in a filter |
|
| 8 |
+ You must provide an oAuth `consumer_key`, `consumer_secret`, `access_key`, and `access_secret`, as well as an array of `filters`. Multiple words in a filter |
|
| 9 | 9 |
must all show up in a tweet, but are independent of order. |
| 10 | 10 |
|
| 11 |
+ To get oAuth credentials for Twitter, [follow these instructions](https://github.com/cantino/huginn/wiki/Getting-a-twitter-oauth-token). |
|
| 12 |
+ |
|
| 11 | 13 |
Set `expected_update_period_in_days` to the maximum amount of time that you'd expect to pass between Events being created by this Agent. |
| 12 | 14 |
|
| 13 | 15 |
`generate` should be either `events` or `counts`. If set to `counts`, it will output event summaries whenever the Agent is scheduled. |
@@ -46,8 +48,14 @@ module Agents |
||
| 46 | 48 |
default_schedule "11pm" |
| 47 | 49 |
|
| 48 | 50 |
def validate_options |
| 49 |
- unless options[:twitter_username].present? && options[:twitter_password].present? && options[:filters].present? && options[:expected_update_period_in_days].present? && options[:generate].present? |
|
| 50 |
- errors.add(:base, "expected_update_period_in_days, generate, twitter_username, twitter_password, and filters are required") |
|
| 51 |
+ unless options[:consumer_key].present? && |
|
| 52 |
+ options[:consumer_secret].present? && |
|
| 53 |
+ options[:access_key].present? && |
|
| 54 |
+ options[:access_secret].present? && |
|
| 55 |
+ options[:filters].present? && |
|
| 56 |
+ options[:expected_update_period_in_days].present? && |
|
| 57 |
+ options[:generate].present? |
|
| 58 |
+ errors.add(:base, "expected_update_period_in_days, generate, consumer_key, consumer_secret, access_key, access_secret, and filters are required fields") |
|
| 51 | 59 |
end |
| 52 | 60 |
end |
| 53 | 61 |
|
@@ -57,8 +65,10 @@ module Agents |
||
| 57 | 65 |
|
| 58 | 66 |
def default_options |
| 59 | 67 |
{
|
| 60 |
- :twitter_username => "---", |
|
| 61 |
- :twitter_password => "---", |
|
| 68 |
+ :consumer_key => "---", |
|
| 69 |
+ :consumer_secret => "---", |
|
| 70 |
+ :access_key => "---", |
|
| 71 |
+ :access_secret => "---", |
|
| 62 | 72 |
:filters => %w[keyword1 keyword2], |
| 63 | 73 |
:expected_update_period_in_days => "2", |
| 64 | 74 |
:generate => "events" |
@@ -7,7 +7,7 @@ module Agents |
||
| 7 | 7 |
description <<-MD |
| 8 | 8 |
The TwitterUserAgent follows the timeline of a specified Twitter user. |
| 9 | 9 |
|
| 10 |
- You must set up a Twitter app and provide it's `consumer_key`, `consumer_secret`, `oauth_token` and `oauth_token_secret`, (Also shown as "Access token" on the Twitter developer's site.) along with the `username` of the Twitter user to monitor. |
|
| 10 |
+ You [must set up a Twitter app](https://github.com/cantino/huginn/wiki/Getting-a-twitter-oauth-token) and provide it's `consumer_key`, `consumer_secret`, `oauth_token` and `oauth_token_secret`, (Also shown as "Access token" on the Twitter developer's site.) along with the `username` of the Twitter user to monitor. |
|
| 11 | 11 |
|
| 12 | 12 |
Set `expected_update_period_in_days` to the maximum amount of time that you'd expect to pass between Events being created by this Agent. |
| 13 | 13 |
MD |
@@ -14,10 +14,15 @@ require 'twitter/json_stream' |
||
| 14 | 14 |
require 'em-http-request' |
| 15 | 15 |
require 'pp' |
| 16 | 16 |
|
| 17 |
-def stream!(username, password, filters, &block) |
|
| 17 |
+def stream!(filters, options = {}, &block)
|
|
| 18 | 18 |
stream = Twitter::JSONStream.connect( |
| 19 | 19 |
:path => "/1/statuses/#{(filters && filters.length > 0) ? 'filter' : 'sample'}.json#{"?track=#{filters.map {|f| CGI::escape(f) }.join(",")}" if filters && filters.length > 0}",
|
| 20 |
- :auth => "#{username}:#{password}",
|
|
| 20 |
+ :oauth => {
|
|
| 21 |
+ :consumer_key => options[:consumer_key], |
|
| 22 |
+ :consumer_secret => options[:consumer_secret], |
|
| 23 |
+ :access_key => options[:access_key], |
|
| 24 |
+ :access_secret => options[:access_secret] |
|
| 25 |
+ }, |
|
| 21 | 26 |
:ssl => true |
| 22 | 27 |
) |
| 23 | 28 |
|
@@ -55,12 +60,11 @@ def load_and_run(agents) |
||
| 55 | 60 |
end |
| 56 | 61 |
end |
| 57 | 62 |
|
| 58 |
- username = agents.first.options[:twitter_username] |
|
| 59 |
- password = agents.first.options[:twitter_password] |
|
| 63 |
+ options = agents.first.options.slice(:consumer_key, :consumer_secret, :access_key, :access_secret) |
|
| 60 | 64 |
|
| 61 | 65 |
recent_tweets = [] |
| 62 | 66 |
|
| 63 |
- stream!(username, password, filter_to_agent_map.keys) do |status| |
|
| 67 |
+ stream!(filter_to_agent_map.keys, options) do |status| |
|
| 64 | 68 |
if status["retweeted_status"].present? && status["retweeted_status"].is_a?(Hash) |
| 65 | 69 |
puts "Skipping retweet: #{status["text"]}"
|
| 66 | 70 |
elsif recent_tweets.include?(status["id_str"]) |